package com.campus.Interceptor;

import com.campus.utils.JwtUtil;
import io.jsonwebtoken.Claims;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @desc: JWT 拦截器，用于在请求处理前验证 JWT Token。
 * @author: hjm
 * @date: 2024/11/22
 */
@Component
public class JwtInterceptor implements HandlerInterceptor {

    /**
     * 在请求处理之前执行，用于验证 JWT Token。
     *
     * @param request  当前请求
     * @param response 当前响应
     * @param handler  处理器
     * @return 如果 Token 验证通过，返回 true；否则返回 false
     * @throws Exception 如果发生异常
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 从请求头中获取 Token
        String token = request.getHeader("Authorization");

        // 检查 Token 是否存在且以 "Bearer " 开头
        if (token != null && token.startsWith("Bearer ")) {
            // 去除 "Bearer " 前缀，获取实际的 Token
            token = token.substring(7);

            try {
                // 验证 Token
                Claims claims = JwtUtil.parseToken(token);

                // 将 Token 数据存入请求属性，以便后续处理使用
                request.setAttribute("user", claims);

                // Token 验证通过，继续处理请求
                return true;
            } catch (Exception e) {
                // Token 验证失败，返回 401 Unauthorized 状态码，并提示无效 Token
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                response.getWriter().write("{\"message\": \"Invalid token\"}");
                return false;
            }
        } else {
            // Token 不存在或格式不正确，返回 401 Unauthorized 状态码，并提示需要 Token
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            response.getWriter().write("{\"message\": \"Token required\"}");
            return false;
        }
    }
}